import { Device } from '@capacitor/device';
import { App, AppInfo } from '@capacitor/app';
import { PublicService } from '@/utils/public';
import { NativeService } from '@/utils/native-service';
import { getServerAppInfo } from '@/utils/http';
import ConfigService from '@/utils/config';
declare let window: any;
let isExit = false;
const urlList = ['/tabs/taskList', '/login', '/tabs/newProblems', '/tabs/home', '/tabs/yzt'];
const publicService = new PublicService();
const nativeService: NativeService = new NativeService();
// 全局变量 - 应用信息（默认）- 需要使用 const定义，否则会报错
const appInfomation = {
  currentPlatform: '', // 当前平台
  currentVersion: '', // 当前app版本
  serverAndroidVersion: '', // 服务器最新app版本 - Android
  serverAndroidAppUpdateUrl: '', // 服务器最新app下载地址 - Android
  serverIosVersion: '', // 服务器最新app版本 - IOS
  serverIosAppUpdateUrl: '', // 服务器最新app下载地址 - IOS
  apkName: '', // 服务器android安装包的名字
};
// 当前的设备所属平台
export const getDeviceInfo = async (): Promise<string> => {
    const info = await Device.getInfo();
    return info.platform;
};

/**
 * 获取用户当前正在使用的app版本
 */
export async function getCurrentAppInfo(): Promise<any> {
    // 调用获取应用信息的API
    const appInfo: AppInfo = await App.getInfo();
    return appInfo;
}


/**
 * 整合服务器上的应用信息及当前应用信息，判断使用哪种平台更新方法
 */
export async function checkVersion() {
     // 获取服务器上的应用信息
  const serverAppInfo: any = await getServerAppInfo({}, false);
  // 获取当前设备平台
  const nowPlatform = await getDeviceInfo();
  // console.log("获取当前设备平台", nowPlatform);
  // 获取当前的应用信息
  const currentAppInfo = await getCurrentAppInfo();
  // console.log("获取当前的应用信息", currentAppInfo);
  // console.log("获取服务器上的应用信息", serverAppInfo);

  // 填充全局变量 - 应用信息
  appInfomation.currentPlatform = nowPlatform; // 当前设备平台
  appInfomation.currentVersion = currentAppInfo.version; // 当前应用版本号
  ConfigService.newAppHost = serverAppInfo.data.ANDROIDURL;
  appInfomation.serverAndroidVersion = serverAppInfo.data.VER_ANDROID; // 服务器上的安卓应用版本
  appInfomation.serverAndroidAppUpdateUrl = serverAppInfo.data.ANDROIDURL; // 服务器上的安卓应用下载地址
  appInfomation.serverIosVersion = serverAppInfo.data.verIos; // 服务器上的苹果应用版本
  appInfomation.serverIosAppUpdateUrl = serverAppInfo.data.iosUrl; // 服务器上的苹果应用下载地址
  appInfomation.apkName = serverAppInfo.data.APKNAME; // 服务器上的应用下载名

  // console.log("整合后的应用信息：", appInfomation);

  if (appInfomation) {
    if (appInfomation.currentPlatform === 'android') {
      updateApp(appInfomation.currentVersion, appInfomation.serverAndroidVersion, appInfomation.serverAndroidAppUpdateUrl, appInfomation.currentPlatform, appInfomation.apkName);
    } else if (appInfomation.currentPlatform === 'ios') {
      updateApp(appInfomation.currentVersion, appInfomation.serverIosVersion, appInfomation.serverIosAppUpdateUrl, appInfomation.currentPlatform);
    } else {
      console.error('获取版本信息失败!');
    }
  }
 }

 /**
 * 判断是否进行更新，判断使用哪种平台提示
 * @param currentVersion 当前应用版本
 * @param serverVersion 服务器上的应用版本
 * @param serverAppUpdateUrl 服务器上的应用下载地址
 * @param currentPlatform 当前设备平台
 * @param apkName 服务器上 android 安装包的名字【可选】
 */
export function updateApp(currentVersion: string, serverVersion: string, serverAppUpdateUrl: string, currentPlatform: string, apkName?: string) {
  // 是否更新
  let ifUpdate = false;
  if (currentVersion && serverVersion) {
    ifUpdate = handleVersion(currentVersion) < handleVersion(serverVersion);
  }
  // 如果需要进行更新
  if (ifUpdate) {
    // this.platform.ready().then(() => {
    if (currentPlatform === 'android') {
      // 触发 Anroid 平台的提示
      presentAlert(currentVersion, serverVersion, serverAppUpdateUrl, currentPlatform, apkName);
    } else {
      // 触发 Ios 平台的提示
      presentAlert(currentVersion, serverVersion, serverAppUpdateUrl, currentPlatform);
    }
  }
}

/**
 * 处理版本号(1.0.0处理为10000)
 * @param num 版本号
 */
 function handleVersion(num: string): number {
  // console.log('处理后的版本号', num.split('.').join('0'));
  return Number(num.split('.').join('0'));
 }

 /**
 * 更新提示、判断执行下载安装包的方法
 * @param currentVersion 当前应用版本
 * @param serverVersion 服务器上的应用版本
 * @param serverAppUpdateUrl 服务器上的应用下载地址
 * @param currentPlatform 当前设备平台
 * @param apkName 服务器上 android 安装包的名字【可选】
 */
async function presentAlert(currentVersion: string, serverVersion: string, serverAppUpdateUrl: string, currentPlatform: string, apkName?: string) {
  publicService.thsPromptAlert('发现新版本, 是否更新?', '<div class="versions">当前版本号：' + currentVersion + '</div><div class="versions">待更新版本号：' + serverVersion + '</div>', (res: any) => {
    if (currentPlatform === 'android' && apkName) { 
      nativeService.fileDown(serverAppUpdateUrl, apkName, false, '下载中，请稍等。。。'); 
    }
  })
}
/**
 * 监听物理返回键
 */
export const listenBack = () => {
  // console.log(window.location);
  App.addListener('backButton', async (ev: any) => {
    // alert('物理回退点击');
    if ((!ev.canGoBack && isExit) || (ConfigService.clickExitButton && isExit)) {
      App.exitApp();
    } else if (ev.canGoBack) {
      console.log(ConfigService.clickExitButton);
      console.log(window?.iosSelect);
      if (window?.iosSelect && window.iosSelect.iosSelectLayer.el) {
        console.log(window?.iosSelect);
        console.log(window.iosSelect.iosSelectLayer.close);
        window.iosSelect.iosSelectLayer.close(); // 关闭iosSelect方法
        window.iosSelect = null;
        ConfigService.clickExitButton = false;
        isExit = false;
      }
    } else if (!ev.canGoBack || !ConfigService.clickExitButton) {
      // alert(JSON.stringify(window.location));
      if (urlList.indexOf(window.location.pathname) !== -1) {
        ConfigService.clickExitButton = true;    
        isExit = true;
        publicService.thsToast('再按一次退出程序', 3000);
        setTimeout(() => {
          isExit = false;
          ConfigService.clickExitButton = false;
        }, 3000)
      }
    }
    if (ConfigService.timer) {
      clearInterval(ConfigService.timer);
      ConfigService.timer = null;
    }
  })
}